/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package ejb.dao;

import entidades.EstadoPedido;
import entidades.LineaPedido;
import entidades.Pedido;
import entidades.Producto;
import java.util.Date;
import java.util.List;
import javax.ejb.EJB;
import javax.ejb.Stateless;
import javax.persistence.Query;

/**
 *
 * @author ribadas
 */
@Stateless
public class PedidoDAO extends GenericoDAO<Pedido> implements PedidoDAORemote, PedidoDAOLocal {

    @EJB
    ProductoDAOLocal productoFacade;


    public List<Pedido> buscarPorCliente(long idCliente) {
        Query q = em.createQuery("SELECT object(p) FROM Pedido AS p "
                + "  WHERE p.cliente.id = :idCliente");
        q.setParameter("idCliente", idCliente);
        return q.getResultList();
    }

    public List<Pedido> buscarPorNombreCliente(String nombreCliente) {
        Query q = em.createQuery("SELECT object(p) FROM Pedido AS p "
                + "  WHERE (p.cliente.nombre LIKE :patron) OR "
                + "        (p.cliente.apellidos LIKE :patron)");
        q.setParameter("patron", "%" + nombreCliente + "%");
        return q.getResultList();
    }

    public List<Pedido> buscarPorFechas(Date fechaInicio, Date fechaFin) {
        Query q = em.createQuery("SELECT object(p) FROM Pedido AS p "
                + "  WHERE (p.fecha BETWEEN :inicio AND :fin");
        q.setParameter("inicio", fechaInicio);
        q.setParameter("fin", fechaFin);
        return q.getResultList();

    }

    public List<Pedido> buscarPorEstado(EstadoPedido estado) {
        Query q = em.createQuery("SELECT object(p) FROM Pedido AS p "
                + "  WHERE p.estado = :estado");
        q.setParameter("estado", estado);
        return q.getResultList();
    }

    public void anularPedido(long idPedido) {
        anularPedido(this.buscarPorId(idPedido));
    }

    public void anularPedido(Pedido pedido) {
        // Cambiar el estado del pedido
        pedido.setEstado(EstadoPedido.ANULADO);
        Pedido pedidoAnulado = actualizar(pedido);

        Producto producto;
        for (LineaPedido linea : pedidoAnulado.getLineasPedido()) {
            // Restaurar las existencias de cada producto del pedido
            producto = linea.getProducto();
            producto.setExistencias((int) (producto.getExistencias() + linea.getCantidad()));
            productoFacade.actualizar(producto);
        }
    }

    public int contador() {
        Query q = em.createQuery("SELECT count(p) FROM Pedido AS p");
        return q.getFirstResult();
    }

    public Pedido buscarPorIdCompleto(long idPedido) {
        Pedido pedido =  em.find(Pedido.class, idPedido);
        pedido.getLineasPedido();  // Forzar la carga de la lista de LineaPedido
        return  pedido;
    }




    // Add business logic below. (Right-click in editor and choose
    // "Insert Code > Add Business Method")
}
